package kr.co.bettersoft.sendme.activity;

import java.util.ArrayList;
import java.util.List;

import kr.co.bettersoft.sendme.provider.SendMeCertification;
import kr.co.bettersoft.sendme.provider.SendMeFriend;
import kr.co.bettersoft.sendme.provider.SendMeInstall;
import kr.co.bettersoft.sendme.provider.SendMeMember;
import kr.co.bettersoft.sendme.provider.SendMeVoice;
import kr.co.bettersoft.sendme.rest.SendMeAudioMessageRest;
import kr.co.bettersoft.sendme.rest.SendMeCertificationRest;
import kr.co.bettersoft.sendme.rest.SendMeInstallRest;
import kr.co.bettersoft.sendme.rest.SendMeMemberRest;
import kr.co.bettersoft.sendme.util.SendMeActivityManager;
import kr.co.bettersoft.sendme.util.SendMeCommon;
import kr.co.bettersoft.sendme.util.SendMeConstant;
import kr.co.bettersoft.sendme.activity.R;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

/**
 * 휴대전화번호 인증 액티비티 클래스 이다.
 * 
 * @author johnkim
 *
 */
public class SendMeCertificationActivity extends Activity {

	public static String TAG = SendMeCertificationActivity.class.getSimpleName();
	
	
	// 액티비티 매니저를 가져 온다.
	private SendMeActivityManager sendMeActivityManager = SendMeActivityManager.getInstance();
	
	EditText editTextPhoneNumber;
	EditText editTextCertificationNumber;
	
	Button buttonRequestCertification;
	Button buttonRequestAdmission;
	
	ProgressBar progressBar;
	
	// 앱을 종료 한다.
	private static final int ALERT_DIALOG_EXIT_ID = 101;
		
	// 인증번호를 요청 한다.
	private static final int THREAD_REQUEST_CERTIFICATION = 102;
	
	// 승인을 요청 한다.
	private static final int THREAD_REQUEST_ADMISSION = 103;
	
	// 멤버 중복 등록을 확인 한다.
	private static final int THREAD_SELECT_DUPLICATION = 104;
	
	// 멤버를 등록 한다.
	private static final int THREAD_REGISTER_MEMBER = 105;
	
	// 프로그레스 바를 출력 한다.
	private static final int THREAD_PROGRESS_BAR_VISIBLE = 106;
	
	// 프로그레스 바를 감춘다.
	private static final int THREAD_PROGRESS_BAR_INVISIBLE = 107;
	
	// SMS 로 인증번호를 발송하면 toast 를 띄운다.
	private static final int THREAD_SMS_SEND_CERTIFICATION = 108;
	
	// 멤버 등록에 성공했다는 toast 를 띄운다.
	private static final int THREAD_SUCCESS_REGISTER_MEMBER = 109;
	
	// 승인에 실패했다는 dialog 를 띄운다.
	private static final int THREAD_FAIL_TO_ADMISSION = 110;
	
	// 멤버 등록에 실패했다는 dialog 를 띄운다.
	private static final int THREAD_FAIL_TO_REGISTER_MEMBER = 111;
	
	// 받은 인증번호를 인증번호 입력란에 세팅 한다.
	private static final int THREAD_SET_CERTIFICATION_NUMBER = 112;
	
	// 전화번호부 목록을 서버로 전달한다
	private static final int THREAD_UPDATE_INSTALL = 113;		
	
	
	// 인증번호 요청 후 임시로 저장하는 사용자 휴대전화번호.
	private String tempPhoneNumber = "";
	
	// 받은 인증번호를 임시로 저장한다.
	private String certificationNumber = "";
	
	// Push id for GCM.
	private String PUSH_ID = "";
	
	// 전화번호 부
	List<SendMeInstall> sendMeInstallList;
			
		
		
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		// 커스텀 타이블 바를 설정 한다.
		Window window = getWindow();
		window.requestFeature(Window.FEATURE_CUSTOM_TITLE);
				
		setContentView(R.layout.activity_send_me_certification);
		
		window.setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.custom_title_bar_01);
		
		// 액티비티 매니저에 담는다.
		sendMeActivityManager.addActivity(this);
		
		// 설정파일을 가져 온다.
		this.confirmNotification();
		
		// 프로그레스 바를 감춘다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
		
		editTextPhoneNumber = (EditText)findViewById(R.id.editTextPhoneNumber);
		editTextCertificationNumber = (EditText)findViewById(R.id.editTextCertificationNumber);
		
		editTextPhoneNumber.requestFocus();
		
		buttonRequestCertification = (Button)findViewById(R.id.buttonRequestCertification);
		buttonRequestAdmission = (Button)findViewById(R.id.buttonRequestAdmission);
		
		progressBar = (ProgressBar)findViewById(R.id.progressBarCertification);
		
		// 전화번호를 가져와서 입력란에 세팅한다.
		TelephonyManager systemService = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
		
		// 전화번호 일반형으로 변환
		String phoneNum = systemService.getLine1Number();
		if(phoneNum.contains("+82")){
			phoneNum = phoneNum.replace("+82", "0");		// +82 10 1234 5678 --> 010 1234 5678  
		}
		phoneNum = phoneNum.replace("-", "");			// - 제거
		
		editTextPhoneNumber.setText(phoneNum);
		
		// 인증번호 요청 버튼을 정의 한다.
		buttonRequestCertification.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_REQUEST_CERTIFICATION));
			}
			
		});
		
		// 승인 요청 버튼을 정의 한다.
		buttonRequestAdmission.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_REQUEST_ADMISSION));
			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.send_me_certification, menu);
		return true;
	}
	
	/**
	 * Handler 를 정의 한다.
	 * 모든 Thread 를 등록해 놓고 호출 한다.
	 */
	private Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch(msg.what) {
			// 인증번호를 요청 한다.
			case THREAD_REQUEST_CERTIFICATION : 
				threadRequestCertification();
				break;
			// 승인을 요청 한다.
			case THREAD_REQUEST_ADMISSION : 
				threadRequestAdmission();
				break;
			// 멤버 중복 등록을 확인 한다.
			case THREAD_SELECT_DUPLICATION : 
				break;
			// 멤버를 등록 한다.
			case THREAD_REGISTER_MEMBER : 
				break;
			// 프로그레스 바를 출력 한다.
			case THREAD_PROGRESS_BAR_VISIBLE : 
				progressBar.setVisibility(View.VISIBLE);
				break;
			// 프로그레스 바를 감춘다.
			case THREAD_PROGRESS_BAR_INVISIBLE : 
				progressBar.setVisibility(View.INVISIBLE);
				break;
			// 뒤로가기 버튼을 터치하면 alert 창을 띄우고 앱을 종료 한다.
			case ALERT_DIALOG_EXIT_ID : 
				showDialogSystemExit();
				break;
			// SMS 로 인증번호를 발송하면 toast 를 띄운다.
			case THREAD_SMS_SEND_CERTIFICATION : 
				showToastSendSMS();
				break;
			// 멤버 등록에 성공했다는 toast 를 띄운다.
			case THREAD_SUCCESS_REGISTER_MEMBER : 
				showToastSuccessRegisterMember();
				break;
			// 승인에 실패했다는 dialog 를 띄운다.
			case THREAD_FAIL_TO_ADMISSION : 
				showDialogFailToAdmission();
				break;
			// 멤버 등록에 실패했다는 dialog 를 띄운다.
			case THREAD_FAIL_TO_REGISTER_MEMBER : 
				showDialogFailToRegisterMember();
				break;
			// 받은 인증번호를 인증번호 입력란에 세팅 한다.
			case THREAD_SET_CERTIFICATION_NUMBER : 
				setCertificationNumber();
				break;
			// 전화번호부 목록을 서버로 전달한다
			case THREAD_UPDATE_INSTALL : 
				threadUpdateInstallAndFinish();
				break;
			}
		}
	};

	/**
	 * 인증번호를 요청 한다.
	 */
	public void threadRequestCertification() {
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
		
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				SendMeCommon sendMeCommon = new SendMeCommon();
				
				SendMeCertification sendMeCertification = new SendMeCertification();
				sendMeCertification.setPhoneNumber(editTextPhoneNumber.getText().toString());
				sendMeCertification.setActivateYn("Y");
				sendMeCertification.setModifyDate(sendMeCommon.getCurrentDate());
				sendMeCertification.setRegisterDate(sendMeCommon.getCurrentDate());
				
				// 요청 후 사용자 휴대전화버호를 임시로 저장한다.
				tempPhoneNumber = editTextPhoneNumber.getText().toString();
				
				SendMeCertificationRest sendMeRest = new SendMeCertificationRest();
				SendMeCertification result = new SendMeCertification();
				result = sendMeRest.requestCertification(sendMeCertification);
				Log.i(TAG, "result : " + result.getResult());
				
				// 프로그레스 바를 감춘다.
				mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
				
				// 인증번호 요청에 성공하면 toast 를 띄워서 알려준다.
				if(("SUCCESS").equals(result.getResult())) {
					certificationNumber = result.getCertificationNumber();
					
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SMS_SEND_CERTIFICATION));
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_SET_CERTIFICATION_NUMBER));
				}
			}
			
		});
		
		thread.start();
	}
	
	/**
	 * 승인을 요청 한다.
	 */
	public void threadRequestAdmission() {
		// 프로그레스 바를 출력 한다.
		mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_VISIBLE));
				
		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				SendMeCertification sendMeCertification = new SendMeCertification();
				sendMeCertification.setPhoneNumber(tempPhoneNumber);
				sendMeCertification.setCertificationNumber(editTextCertificationNumber.getText().toString());
				sendMeCertification.setActivateYn("Y");
				
				SendMeCertificationRest sendMeCertificationRest = new SendMeCertificationRest();
				String result = sendMeCertificationRest.requestAdmission(sendMeCertification).getResult();
				Log.i(TAG, "result : " + result);
				
				// 승인에 성공하면 메인화면으로 이동 한다.
				if(("SUCCESS_ADMISSION").equals(result)) {
					// 사용자를 등록 한다.
					SendMeMember sendMeMember = new SendMeMember();
					sendMeMember.setPhoneNumber(editTextPhoneNumber.getText().toString());
					sendMeMember.setActivateYn("Y");
					
					SendMeCommon sendMeCommon = new SendMeCommon();
					
					SendMeMemberRest sendMeMemberRest = new SendMeMemberRest();
					
					String totalCount = sendMeMemberRest.selectDuplication(sendMeMember).getTotalCount();
					Log.d(TAG,"totalCount:"+totalCount);
					if(("0").equals(totalCount)) {
						sendMeMember.setNickName("");
						sendMeMember.setEmail("");
						sendMeMember.setDeviceType(SendMeConstant.DEVICE_TYPE);
						sendMeMember.setPushId(PUSH_ID);
						sendMeMember.setPayYn(SendMeConstant.PAY_YN);
						sendMeMember.setActivateYn("Y");
						sendMeMember.setModifyDate(sendMeCommon.getCurrentDate());
						sendMeMember.setRegisterDate(sendMeCommon.getCurrentDate());
						
						if(("SUCCESS").equals(sendMeMemberRest.registerMember(sendMeMember).getResult())) {
							// 멤버 등록했다는 toast 를 띄운다.
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_SUCCESS_REGISTER_MEMBER));
							
							// 전화번호를 설정파일에 저장 한다.
							SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
							SharedPreferences.Editor editor = sharedPreferences.edit();
							editor.putString("phone_number", editTextPhoneNumber.getText().toString());
							editor.commit();
							
							// 프로그레스 바를 감춘다.
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
							
							// 메인 화면을 출력 한다.
							Intent i = new Intent(SendMeCertificationActivity.this, SendMeMainActivity.class);
							startActivity(i);
							
							
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_INSTALL));
							
							
//							// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
//							sendMeActivityManager.removeActivity(SendMeCertificationActivity.this);
//							
//							// 액티비티를 종료 한다.
//							finish();
						} else {
							// 프로그레스 바를 감춘다.
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
							
							// 멤버 등록 실패했으니 삭제하고 다시 설치하라는 dialog 를 띄운다.
							mHandler.sendMessage(mHandler.obtainMessage(THREAD_FAIL_TO_REGISTER_MEMBER));
						}
					}else{
						// 전화번호를 설정파일에 저장 한다.
						SharedPreferences sharedPreferences = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
						SharedPreferences.Editor editor = sharedPreferences.edit();
						editor.putString("phone_number", editTextPhoneNumber.getText().toString());
						editor.commit();
						
						// 프로그레스 바를 감춘다.
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
						
						// 메인 화면을 출력 한다.
						Intent i = new Intent(SendMeCertificationActivity.this, SendMeMainActivity.class);
						startActivity(i);
						
						
						mHandler.sendMessage(mHandler.obtainMessage(THREAD_UPDATE_INSTALL));
						
//						// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
//						sendMeActivityManager.removeActivity(SendMeCertificationActivity.this);
//						
//						// 액티비티를 종료 한다.
//						finish();
					}
				} else {
					// 프로그레스 바를 감춘다.
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_PROGRESS_BAR_INVISIBLE));
					
					// 다시 인증하라는 dialog 를 띄운다.
					mHandler.sendMessage(mHandler.obtainMessage(THREAD_FAIL_TO_ADMISSION));
				}
			}
					
		});
				
		thread.start();
	}
	
	/**
	 * 전화번호부에 있는 데이터를 읽어서 서버로 전송한다. (설치한 친구 목록을 업데이트 한다.)
	 *  이후 액티비티를 종료한다
	 *  서버로 전번 보내는 부분이라서 sendMeCommon.selectPhoneBookAddress 호출함
	 */
	public void threadUpdateInstallAndFinish() {

		Thread thread = new Thread(new Runnable() {

			public void run() {
				// TODO Auto-generated method stub
				
				/*
				 * 뱃지 업데이트
				 */
				SendMeAudioMessageRest sendMeAudioMessageRest = new SendMeAudioMessageRest();
				
				SendMeVoice sendMeVoice = new SendMeVoice();
				sendMeVoice.setReceiver(tempPhoneNumber);
				
				int unReadCount = sendMeAudioMessageRest.selectUnreadVoiceCount(sendMeVoice);
				
				SendMeCommon sendMeCommon = new SendMeCommon();
				// 안읽은 메시지 개수 
				
				Log.d(TAG,"unReadCount::"+unReadCount);
				sendMeCommon.badgeCountPrefSave(returnThis(), unReadCount);
				// 뱃지 업데이트
				sendMeCommon.badgeCountAutoSet(returnThis());
				
				
				/*
				 * 전화번호부 서버로 업데이트
				 */
				ArrayList<SendMeFriend> phoneBookAddress = sendMeCommon.selectPhoneBookAddress(returnThis());  
				
				sendMeInstallList = new ArrayList<SendMeInstall>();
				String nowTime = sendMeCommon.getCurrentDate();
				
				for(int i=0; i<phoneBookAddress.size(); i++){
					
					SendMeInstall sendMeInstall = new SendMeInstall();
					sendMeInstall.setPhoneNumber(phoneBookAddress.get(i).getPhoneNumber());
					sendMeInstall.setActivateYn("Y");
					sendMeInstall.setModifyDate(nowTime);
					sendMeInstall.setRegisterDate(nowTime);
					sendMeInstall.setSendMeMemberPhoneNumber(tempPhoneNumber);

					sendMeInstallList.add(sendMeInstall);
				}
				
				SendMeInstallRest sendMeInstallRest = new SendMeInstallRest();
				sendMeInstallRest.updateInstall(sendMeInstallList);

				// 종료하기 전에 액티비티 매니져에서 액티비티를 삭제 한다.
				sendMeActivityManager.removeActivity(SendMeCertificationActivity.this);
				
				// 액티비티를 종료 한다.
				finish();
			}
		});
		thread.start();
	}
	
	
	/**
	 * 받은 인증번호를 인증번호 입력란에 세팅해서 출력 한다. 
	 * 출력 후 임시 파라메터는 다시 초기화 한다.
	 */
	public void setCertificationNumber() {
		editTextCertificationNumber.setText(certificationNumber);
		certificationNumber = "";
	}
	
	/**
	 * 뒤로 가기 버튼을 정의 한다.
	 * 설치단계이기 때문에 뒤로가기 버튼을 터치하면 앱을 종료 한다.
	 */
	@Override
	public void onBackPressed() {
		// TODO Auto-generated method stub
		mHandler.sendMessage(mHandler.obtainMessage(ALERT_DIALOG_EXIT_ID));
	}
	
	/**
	 * 뒤로가기 버튼을 터치하면 alert 창을 띄우고 앱을 종료한다.
	 */
	private void showDialogSystemExit() {
		new AlertDialog.Builder(SendMeCertificationActivity.this)
		.setTitle("프로그램 종료")
		.setMessage("SendMe 를 종료하시겠습니까?")
		.setNegativeButton("취소", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		})
		.setPositiveButton("확인", new DialogInterface.OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				sendMeActivityManager.finishAllActivity();
			}
		}).show();
	}
	
	/**
	 * 승인에 실패했다는 dialog 를 띄운다.
	 */
	private void showDialogFailToAdmission() {
		new AlertDialog.Builder(SendMeCertificationActivity.this)
		.setTitle("휴대전화번호 승인")
		.setMessage("승인에 실패했습니다.\n인증번호를 다시 요청하고 승인신청을 하시기 바랍니다.")
		.setNegativeButton("확인", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		}).show();
	}
	
	/**
	 * 멤버 가입에 실패했다는 dialog 를 띄운다.
	 */
	private void showDialogFailToRegisterMember() {
		new AlertDialog.Builder(SendMeCertificationActivity.this)
		.setTitle("SendMe 멤버 등록")
		.setMessage("멤버 등록에 실패했습니다.\n인증번호를 다시 요청하고 승인신청을 하시기 바랍니다.")
		.setNegativeButton("확인", new DialogInterface.OnClickListener() {

			@Override
			public void onClick(DialogInterface dialog, int which) {

			}
		}).show();
	}

	/**
	 * 화면 가운데 SMS 로 인증번호가 발송되었다는 toast 를 띄운다.
	 */
	public void showToastSendSMS() {
		CharSequence text = "SMS 로 인증번호가 발송되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
	/**
	 * 멤버 등록에 성공했다는 toast 를 띄운다.
	 */
	public void showToastSuccessRegisterMember() {
		CharSequence text = "SendMe 멤버로 등록되었습니다.";
		Toast toast = Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.CENTER_VERTICAL|Gravity.CENTER_HORIZONTAL, 0, 0);
		toast.show();
	}
	
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////	
	
	// context
	public Context returnThis(){
		return this;
	}
	
	
	/**
	 * SharedPreference 정보를 확인 한다.
	 */
	public void confirmNotification() {
		SharedPreferences mSharedPreference = getSharedPreferences(SendMeConstant.SENDME_PREFERENCE, Activity.MODE_PRIVATE);
		
		PUSH_ID = mSharedPreference.getString("push_id", "");
		Log.i(TAG, "PUSH_ID : " + PUSH_ID);
	}

}
